home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 43 / Amiga Format CD43 (1999)(Future Publishing)(GB)(Track 1 of 2)[!][issue 1999-09].iso / -serious- / archivers / xfd / developer / sources / asm / pcr4.a < prev    next >
Text File  |  1999-06-14  |  4KB  |  189 lines

  1. ;External decruncher for xfdmaster.library
  2. ;It decrunches PCR4 packed files.
  3. ;31.8.1997
  4.     INCLUDE    AINCLUDE:IncDirs.i
  5.     INCLUDE    libraries/xfdmaster.i
  6.     INCLUDe    lvo.i
  7. ;    include    "dh0:asm/newincl/values/xfdmaster.i"
  8. ;    include    "dh0:asm/newincl/offsets/libs.offsets"
  9.  
  10. ;    opt    x-,o-,w-
  11.     moveq    #-1,d0
  12.     rts
  13.     dc.l    XFDF_ID        ;'XFDF' identifier
  14.     dc.w    1        ;XFDF version
  15.     dc.w    $0000        ;must be null
  16.     dc.l    0        ;private
  17.     dc.l    0        ;private
  18.     dc.l    pcr4slave        ;first slave
  19.     dc.b    '$VER: External PCR4 decruncher for xfdmaster.library by TTL (31.08.97)'
  20.     dc.b    10,0
  21.     even
  22. pcr4slave
  23.     dc.l    0        ;no next slave
  24.     dc.w    2        ;xfds version
  25.     dc.w    36        ;minimum xfdM version required
  26.     dc.l    pcr4name    ;name of packer
  27.     dc.w    XFDPFF_DATA    ;packer flags
  28.                 ;=data file packer
  29.     dc.w    0        ;max. lenght of special info
  30.     dc.l    pcr4test    ;ptr to recognition buffer
  31.     dc.l    unpack        ;ptr to buffer decrunch code
  32.     dc.l    0        ;ptr to segment recognition code
  33.     dc.l    0        ;ptr to segment decrunch code
  34.     dc.l    0
  35.     dc.l    0
  36.     dc.l    12
  37.  
  38. pcr4name    dc.b    '(PCR4) Data Cruncher',0
  39.     even
  40. pcr4test
  41. ;from xfdmaster    in:    a0=buffer
  42. ;            d0=length
  43.  
  44.     cmp.l    #'PCR4',(a0)
  45.     bne.s    .err        ;bad identifier
  46. ;these tests are from original PCR4 depack
  47.     move.l    4(a0),d1    * fixed
  48.     bmi.s    .err
  49.     cmp.l    #$1800000,d1    * fixed
  50.     bgt.s    .err
  51.     tst.l    8(a0)
  52.     ble.s    .err
  53. .ok    moveq    #1,d0        ;ok, I hope it is right packed data
  54.     rts
  55. .err    moveq    #0,d0        ;error
  56.     rts
  57.  
  58. ;in: A0-adr of xfd buffer info
  59. unpack        movem.l    d2-d7/a2-a6,-(sp)
  60.     move.l    a0,a5
  61.     move.l    xfdbi_SourceBuffer(a5),a2    ;adr of PCR4 packed data
  62.     move.l    4(a2),d0            ;get decrunched lenght
  63.     move.l    d0,xfdbi_TargetBufSaveLen(a5)
  64.     move.l    d0,xfdbi_TargetBufLen(a5)
  65.     move.l    xfdbi_TargetBufMemType(a5),d1    ;get memf
  66.     move.l    4.w,a6                ;execbase
  67.     jsr    _LVOAllocMem(a6)        ;allocmem
  68.     move.w    #XFDERR_NOMEMORY,xfdbi_Error(a5)
  69.     move.l    d0,xfdbi_TargetBuffer(a5)
  70.     beq.s    .err                ;no memory
  71.     move.w    #XFDERR_OK,xfdbi_Error(a5)    ;memory ok
  72.     move.l    d0,a1                ;adr of decrunched data
  73.     move.l    a2,a0                ;adr of crunched data
  74.  
  75.     bsr.s    PCR4UNPACK
  76.     beq.s    .ok
  77.     move.w    #XFDERR_CORRUPTEDDATA,xfdbi_Error(a5)
  78.     moveq    #0,d0        ;unpack error
  79.     bra.s    .err
  80. .ok    moveq    #1,d0        ;all ok
  81. .err    movem.l    (sp)+,d2-d7/a2-a6
  82.     rts
  83.  
  84. ;PCR4 unpack from game onEscapee
  85. ;in: a0-source, a1-destination
  86. PCR4UNPACK
  87.         movem.l    d0-d7/a0-a2,-(a7)
  88.         cmpi.l    #$50435234,(a0)+
  89.         bne    l782832A4        ;test it again
  90. ;        move.l    (a0),d6
  91. ;        bmi    l782832A4
  92. ;        cmp.l    #$1800000,d6
  93. ;        bgt    l782832A4
  94. ;        tst.l    4(a0)
  95. ;        ble    l782832A4
  96.         move.l    a1,d6
  97.         add.l    (a0)+,d6
  98.         move.l    (a0)+,d7
  99. l782831DC    moveq    #0,d2
  100. l782831DE    moveq    #0,d0
  101.         moveq    #0,d1
  102.         subq.l    #1,d7
  103.         bmi    l7828329A
  104.         move.b    (a0)+,d0
  105.         btst    #0,d0
  106.         bne.s    l78283204
  107.         tst.b    d0
  108.         bpl.s    l78283242
  109.         ror.l    #7,d0
  110.         move.b    (a0)+,d0
  111.         bpl.s    l7828323C
  112.         ror.l    #7,d0
  113.         move.b    (a0)+,d0
  114.         swap    d0
  115.         ror.l    #2,d0
  116.         bra.s    l78283242
  117. l78283204    move.b    (a0)+,d1
  118.         lsr.b    #2,d0
  119.         bcs.s    l78283222
  120.         subq.w    #1,d0
  121.         bmi.s    l78283214
  122. l7828320E    move.b    (a0)+,(a1)+
  123.         dbf    d0,l7828320E
  124. l78283214    addq.w    #3,d1
  125.         movea.l    a1,a2
  126.         suba.w    d1,a2
  127.         move.b    (a2)+,(a1)+
  128.         move.b    (a2)+,(a1)+
  129.         move.b    (a2),(a1)+
  130.         bra.s    l782831DE
  131. l78283222    subq.w    #1,d0
  132.         bmi.s    l7828322C
  133. l78283226    move.b    (a0)+,(a1)+
  134.         dbf    d0,l78283226
  135. l7828322C    addq.w    #4,d1
  136.         movea.l    a1,a2
  137.         suba.w    d1,a2
  138.         move.b    (a2)+,(a1)+
  139.         move.b    (a2)+,(a1)+
  140.         move.b    (a2)+,(a1)+
  141.         move.b    (a2),(a1)+
  142.         bra.s    l782831DE
  143. l7828323C    andi.b    #$7F,d0
  144.         rol.l    #7,d0
  145. l78283242    lsr.l    #1,d0
  146.         move.b    (a0)+,d2
  147.         beq.s    l78283282
  148.         bpl.s    l78283250
  149.         ror.w    #7,d2
  150.         move.b    (a0)+,d2
  151.         rol.w    #7,d2
  152. l78283250    move.b    (a0)+,d1
  153.         bpl.s    l7828325A
  154.         ror.w    #7,d1
  155.         move.b    (a0)+,d1
  156.         rol.w    #7,d1
  157. l7828325A    subq.l    #1,d0
  158.         bmi.s    l7828326E
  159.         bra.s    l78283262
  160. l78283260    swap    d0
  161. l78283262    move.b    (a0)+,(a1)+
  162.         dbf    d0,l78283262
  163.         swap    d0
  164.         dbf    d0,l78283260
  165. l7828326E    addq.w    #3,d2
  166.         add.w    d2,d1
  167.         addq.w    #1,d1
  168.         movea.l    a1,a2
  169.         suba.w    d1,a2
  170. l78283278    move.b    (a2)+,(a1)+
  171.         dbf    d2,l78283278
  172.         bra    l782831DC
  173. l78283282    subq.l    #1,d0
  174.         bmi.s    l7828329A
  175.         bra.s    l7828328A
  176. l78283288    swap    d0
  177. l7828328A    move.b    (a0)+,(a1)+
  178.         dbf    d0,l7828328A
  179.         swap    d0
  180.         dbf    d0,l78283288
  181.         bra    l782831DC
  182. l7828329A    cmp.l    a1,d6
  183.         moveq    #0,d0
  184. pcr4end        tst.l    d0
  185.         movem.l    (a7)+,d0-d7/a0-a2
  186.         rts
  187. l782832A4    moveq    #-1,d0
  188.         bra.s    pcr4end
  189.